package com.example.dwhne.leonweather;

import android.Manifest;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.Toast;

import java.util.List;

import interfaces.heweather.com.interfacesmodule.bean.Lang;
import interfaces.heweather.com.interfacesmodule.bean.Unit;
import interfaces.heweather.com.interfacesmodule.bean.basic.Basic;
import interfaces.heweather.com.interfacesmodule.bean.search.Search;
import interfaces.heweather.com.interfacesmodule.bean.weather.now.Now;
import interfaces.heweather.com.interfacesmodule.view.HeConfig;
import interfaces.heweather.com.interfacesmodule.view.HeWeather;

public class CitySelect extends AppCompatActivity {
    private AutoCompleteTextView weather_text;
    private Button GPSBUtton;
    private int cityNum;
    private ArrayAdapter<String> adapter1;
    private String cityBefore;
    private String cityCNcodeList[];
    private String alternativeCityList[];
    private boolean noClickFlog=true;
    private boolean drapDownFlog=true;
    private boolean equalsFlog=false;
    private String CNcode;
    private int cityPosition;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_city_select);
        positionPermissionIni();

        weather_text=findViewById(R.id.weather_EditText);//输入框实例化
        GPSBUtton=findViewById(R.id.weather_Button);

        //选择项内容判定，确定进入下一级显示还是进入天气显示界面。
        weather_text.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                //beforeTextChanged内的代码用于保存之前输入的内容
                String before=weather_text.getText().toString();
                int s2=before.indexOf("-");
                if(s2!=-1){
                    cityBefore=before.substring(0,before.indexOf("-"));
                }else{
                    cityBefore=before;
                }
//                Log.i("Log", "beforeTextChanged: "+s2+cityBefore);
            }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
//                Log.i("Log", "onTextChanged: 输入为" + weather_text.getText().toString());
                //提取点击内容，确定点击内容与之前输入内容是否一致，若一致，说明用户需要的的是市一级天气信息。
                weather_text.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        noClickFlog=false;
                        String clickInput = adapter1.getItem(position);
                        CNcode=cityCNcodeList[position];
                        final String clickInput1=clickInput.substring(0,clickInput.indexOf("-"));
//                        Log.i("Log", "onItemClick: "+clickInput1+":"+cityBefore);
                        if ((cityBefore.equals(clickInput1))) {
                            equalsFlog=true;
                        }
                    }
                });

                //获取新输入信息，进行城市列表搜索
                String in1=weather_text.getText().toString();
                String input1;
                int s3=in1.indexOf("-");
                if(s3!=-1){
                    input1=in1.substring(0,in1.indexOf("-"));
                }else{
                    input1=in1;

                }
//                Log.i("Log", "onTextChanged: "+s3+input1);
                if(input1.length()>0){
                    citySearch(input1);
                }

            }
            @Override
            public void afterTextChanged(Editable s) {
            }
        });

        GPSBUtton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                weatherCityCNSend(null);
            }
        });

    }


    /**
     * 搜索城市，获得城市列表和CN码列表，并确定是进入下一级列表还是进入城市显示界面
     * @param inputCityName
     */
    private void citySearch(String inputCityName){
//        Log.i("Log", "onSuccess: "+inputCityName);
        /**
         * @param context  上下文
         * @param location (输入需要查询的城市名称，支持模糊搜索，可输入中文（至少一个汉字）、英文（至少2个字母）、IP地址、坐标（经度在前纬度在后，英文,分割）、ADCode
         * @param group    城市查询分组，默认为全球城市，可按照任意国家范围进行查询，国家名称需使用[ISO 3166 所定义的国家代码](https://www.heweather.com/blog/iso-3166)
        特殊值：world，查询全球城市
        特殊值：scenic，查询中国4A和5A级景点地区
        特殊值：overseas，查询除中国以外的全部海外城市
        查询分组可最多设置20个值，多个值用英文,连接
         * @param number     搜索查询返回的数量，默认返回10个与查询城市或的确相关性最强的结果，可选1-20个，当使用IP地址或坐标查询时，仅返回一个结果
         * @param lang     多语言，默认为简体中文，其他语言请参照多语言对照表
         * @param listener 网络访问回调接口
         */
        HeWeather.getSearch(CitySelect.this, inputCityName, "CN", 20, Lang.CHINESE_SIMPLIFIED,
                new HeWeather.OnResultSearchBeansListener() {
                    @Override
                    public void onError(Throwable throwable) {
                        Toast.makeText(CitySelect.this, "搜索失败,请输入正确的城市名称", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onSuccess(Search search) {
                        //Log.i("Log", "onSuccess: " + new Gson().toJson(search));
                        List<Basic> cityList = search.getBasic();
                        cityNum = cityList.size();

                        //以下几个判断语句为控制逻辑
                        if (cityNum < 2&&!noClickFlog) {//如果城市搜索结果只有一个，且文本框内容是通过点击item输入的，
                            drapDownFlog=false;         // 则不再进入下一级，直接跳转至天气显示界面
//                            Log.i("Log", "citySearch：备选城市只有一个，进入天气显示");
                        }else{
                            drapDownFlog=true;          // 其他情况暂定进入下一级列表
//                            Log.i("Log", "citySearch：备选城市不止一个");
                        }

                        if(equalsFlog){                 //判断新输入内容(一般为点击列表)与之前是否一致，若一致转到天气显示界面
                            drapDownFlog=false;
//                            Log.i("Log", "citySearch：输入与点击相等，进入天气显示");
                        }

                        //下拉显示和跳转控制，若下拉标识位drapDownFlog为true则进入下一级列表，
                        // 若为flase则转到天气显示界面，二选一，没有其他选择。
                        if(drapDownFlog){
                            //创建备选城市列表和CN码列表
                            alternativeCityList= new String[cityNum];
                            cityCNcodeList= new String[cityNum];
                            for (int j = 0; j < cityNum; j++) {
                                Basic basic = cityList.get(j);
                                cityCNcodeList[j]=basic.getCid();
                                alternativeCityList[j] = basic.getLocation()+"-"+basic.getParent_city()+","+basic.getAdmin_area()+","+basic.getCnty();
                            }
                            adapter1 = new ArrayAdapter<String>(CitySelect.this, android.R.layout.simple_list_item_1, alternativeCityList);//设置适配器
                            weather_text.setAdapter(adapter1);
                            weather_text.showDropDown();
                        }else {
                            weatherCityCNSend(CNcode);
                        }
//                        Log.i("Log", "onSuccess: "+alternativeCityList.length);
                    }
                });

    }


    /**
     * 获取目标城市的CN码并跳转至显示界面
     *@param cityCNCode 城市CN码
     */
    private void weatherCityCNSend( final String cityCNCode){
/**
 * @param context  上下文
 * @param location (如果不添加此参数,SDK会根据GPS联网定位,根据当前经纬度查询)  所查询的地区，可通过该地区名称、ID、Adcode、IP
 *                 和经纬度进行查询经纬度格式：纬度,经度（英文,分隔，十进制格式，北纬东经为正，南纬西经为负)
 * @param lang     多语言，默认为简体中文，其他语言请参照多语言对照表
 * @param unit     单位选择，公制（m）或英制（i），默认为公制单位
 * @param listener 网络访问回调接口
 */
        HeWeather.getWeatherNow(CitySelect.this, cityCNCode, Lang.CHINESE_SIMPLIFIED, Unit.METRIC,
                new HeWeather.OnResultWeatherNowBeanListener() {
                    @Override
                    public void onError(Throwable e) {
                        //Log.i("Log", "onError: ", e);
                        Toast.makeText(CitySelect.this, "搜索失败,请输入正确的城市名称", Toast.LENGTH_SHORT).show();
                        //finish();
                    }
                    @Override
                    public void onSuccess(List<Now> dataObject) {
//                        Toast.makeText(weathertest.this, "正在查询天气信息...", Toast.LENGTH_SHORT).show();
                        Now now=dataObject.get(0);
                        Basic basic=now.getBasic();
                        String cityCNNow=basic.getCid();
                        String cityParentNow=basic.getParent_city();
                        //使用SharedPreferences存储技术对城市CN码列表进行读取
                        SharedPreferences c=getSharedPreferences("cities",MODE_PRIVATE);
                        SharedPreferences p=getSharedPreferences("parentCities",MODE_PRIVATE);

                        String cityCNs[]=new String[5];
                        String parentCities[]=new String[5];

                        for(int i=0;i<4;i++){
                            parentCities[i]=p.getString("CN"+i,null);
                            cityCNs[i]=c.getString("CN"+i,null);
                            if(cityCNNow.equals(cityCNs[i])){
                                cityPosition=i;
                                break;
                            }else{
                                cityPosition=100;
                            }
                        }
                        Log.i("Test", "cityPosition"+cityPosition);
                        //排序后重新将数据写入,使用SharedPreferences存储技术对城市CN码列表进行存储
                            SharedPreferences.Editor citiesShare=getSharedPreferences("cities",MODE_PRIVATE).edit();
                            SharedPreferences.Editor parentCitiesShare=getSharedPreferences("parentCities",MODE_PRIVATE).edit();
                            if(cityPosition==100){
                            for(int i=4;i>0;i--){
                                cityCNs[i]=cityCNs[i-1];
                                parentCities[i]=parentCities[i-1];
                            }
                            cityCNs[0]=cityCNNow;
                            parentCities[0]=cityParentNow;
                            for(int i=0;i<5;i++){
                                citiesShare.putString("CN"+i,cityCNs[i]);
                                parentCitiesShare.putString("CN"+i,parentCities[i]);
                            }
                            citiesShare.commit();
                            parentCitiesShare.commit();
                            cityPosition=0;
                        }
                        SharedPreferences.Editor hPosition=getSharedPreferences("historyPosition",MODE_PRIVATE).edit();
                        hPosition.putInt("Position",cityPosition);
                        hPosition.commit();
//                        Log.i("Test", "数据存储完成");
                        Intent intent=new Intent(CitySelect.this,WeatherShow.class);//构建一个intent对象，第一个参数：上下文，第二个：目标活动
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//                        intent.putExtra("weatherCityPosition",cityPosition);
                        startActivity(intent);//执行intent活动，跳转至第二个页面
                        finish();
                    }
                });
    }
    private void positionPermissionIni(){
        //获取定位权限
        if (Build.VERSION.SDK_INT >= 23) {

            //如果用户并没有同意该权限
            if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) !=
                    PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest
                    .permission.ACCESS_COARSE_LOCATION) != PackageManager
                    .PERMISSION_GRANTED) {
                //申请权限
//                setContentView(R.layout.welcome);
                requestPermissions(new String[]{Manifest.permission
                        .ACCESS_FINE_LOCATION}, 100);
                requestPermissions(new String[]{Manifest.permission
                        .ACCESS_COARSE_LOCATION}, 101);
            } else {
                //有权限直接获取地理位置

            }
        } else {//低版本手机，直接获取位置信息
        }
    }

}
